package org.acb.sgp.dao.impl;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.acb.sgp.beans.Episodio;
import org.acb.sgp.dao.EpisodioDao;
import org.acb.sgp.factory.ConnectionFactory;

public class EpisodioDaoImpl implements EpisodioDao {

    private Connection con;
    private CallableStatement cs;
    private ResultSet rs;

    private Connection getConnection() throws SQLException {
        return ConnectionFactory.getInstance().getConnection();
    }

    @Override
    public void registrarEpisodio(Episodio episodio) {
        String sql = "{Call RegistrarEpisodio(?,?,?,?,?,?)}";
        try {
            con = getConnection();
            cs = con.prepareCall(sql);
            cs.setString(1, episodio.getNomEpisodio());
            cs.setString(2, episodio.getNumEpisodio());
            cs.setString(3, episodio.getStrSinopsis());
            cs.setInt(4, episodio.getPrograma().getCodPrograma());
            cs.setInt(5, episodio.getEstado().getCodEstado());
            if (episodio.getCodEpisodio() == null) {
                cs.setString(6, "0");
                cs.registerOutParameter(6, Types.INTEGER);
                cs.execute();
                episodio.setCodEpisodio(Integer.valueOf(cs.getObject(6).toString()));
            } else {
                cs.setString(6, episodio.getCodEpisodio().toString());
                cs.execute();
            }
        } catch (SQLException ex) {
            Logger.getLogger(EpisodioDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            ConnectionFactory.closing(rs, cs, con);
        }
    }

    @Override
    public void eliminarEpisodio(Episodio espisodio) {

    }

    @Override
    public Episodio buscarEpisodioPorCodigo(Integer codEpisodio) {
        Episodio episodio = new Episodio();
        try {
            String sql = "{Call BuscarEpisodioPorCodigo(?)}";
            con = getConnection();
            cs = con.prepareCall(sql);
            cs.setInt(1, codEpisodio);
            rs = cs.executeQuery();
            if (rs.next()) {
                episodio = llenar(rs);
            }
        } catch (SQLException e) {
            System.out.println("ERROR EN EpisodioDaoImpl>buscarEpisodioPorCodigo: " + e.toString());
        } finally {
            ConnectionFactory.closing(rs, cs, con);
        }
        return episodio;
    }

    @Override
    public List<Episodio> listaEpisodios() {
        List<Episodio> episodios = new ArrayList<Episodio>();
        try {
            String sql = "{Call ListarEpisodios()}";
            con = getConnection();
            cs = con.prepareCall(sql);
            rs = cs.executeQuery();
            while (rs.next()) {
                episodios.add(llenar(rs));
            }
        } catch (SQLException e) {
            System.out.println("ERROR EN EpisodioDaoImpl>listaEpisodio: " + e.toString());
        } finally {
            ConnectionFactory.closing(rs, cs, con);
        }
        return episodios;
    }

    @Override
    public List<Episodio> buscarEpisodiosPorCodPrograma(Integer codPrograma) {
        List<Episodio> episodios = new ArrayList<Episodio>();
        try {
            String sql = "{Call BuscarEpisodiosPorCodPrograma(?)}";
            con = getConnection();
            cs = con.prepareCall(sql);
            cs.setInt(1, codPrograma);
            rs = cs.executeQuery();
            while (rs.next()) {
                episodios.add(llenar(rs));
            }
        } catch (SQLException e) {
            System.out.println("ERROR EN EpisodioDaoImpl>buscarEpisodiosPorCodPrograma: " + e.toString());
        } finally {
            ConnectionFactory.closing(rs, cs, con);
        }
        return episodios;
    }

    private Episodio llenar(ResultSet rs) throws SQLException {
        Episodio episodio = new Episodio();
        episodio.setCodEpisodio(rs.getInt("codEpisodio"));
        episodio.getPrograma().setCodPrograma(rs.getInt("codPrograma"));
        episodio.getPrograma().setNomPrograma(rs.getString("nomPrograma"));
        episodio.setNomEpisodio(rs.getString("nomEpisodio"));
        episodio.setNumEpisodio(rs.getString("numEpisodio"));
        episodio.setStrSinopsis(rs.getString("strSinopsis"));
        episodio.getEstado().setCodEstado(rs.getInt("codEstado"));
        return episodio;
    }

}
